// 第一题：数组去重（基础题）
// 题目：实现一个数组去重函数，要求：
// 支持基本类型去重
// 支持对象去重（根据某个key）
// 考虑性能优化
// 要求：请用TypeScript实现，并分析时间复杂度

/**
 * 总结：
 * isPrimitive判断是否为原始类型，亮点：使用了: val is Record<string, unknown>进行类型收窄
 * deDuplication思路很清晰，就是对result数组进行构造—遍历要去重的数组，如果已有元素就不添加到result中，否则添加
 * 时间复杂度高：O(n**2)，因为在循环中使用的result.includes、result.some都是O(n)，优化思路：通过Set进行优化，因为Set的get是O(1)
 */
const isPrimitive = (val: unknown): val is Record<string, unknown> => {
  const isObj = typeof val === 'object' && val !== null;
  return !isObj;
};

function deDuplication<T>(arr: Array<T>, objKey: string) {
  const result: Array<T> = [];

  arr.forEach((val) => {
    if (
      isPrimitive(val)
        ? result.includes(val)
        : result.some((item) => (item as Record<string, unknown>)[objKey] === (val as Record<string, unknown>)[objKey])
    )
      return;
    result.push(val);
  });

  return result;
}

const arr = [1, 1, { name: 'jrd' }, { name: 'jrd' }];

console.log(deDuplication(arr, 'name'));